カブロボコンテストのプログラムでエラーが発生する理由とは?

このQ&Aのポイント
  • カブロボコンテストのプログラムで、シンボル:holding シンボルを解決できませんというエラーが発生しています。
  • 原因は、Holding オブジェクトが宣言されていないためです。
  • エラーを解決するには、Holding オブジェクトを適切に宣言する必要があります。
回答を見る
  • ベストアンサー

カブロボコンテストのプログラム

カブロボコンテストのプログラムで、以下のようなプログラムを作りましたが、コンパイルしたら、シンボル:holding シンボルを解決できませんというエラーが出ます。どうしたらエラーを直せるでしょうか?(字数制限のため、一部プログラムを削除していますが、質問にはあまり関係ないと思います。) import java.util.*; import jp.kaburobo.robot.Robot; import jp.kaburobo.investment.*; import jp.kaburobo.information.*; import jp.kaburobo.util.*; import jp.kaburobo.technical.*; public class RSIRobot2 implements Robot{ public void run (InvestmentAgent investmentAgent){ for(int i=0;i<stocks.length;i++){ List indexList = informationManager.getIndexInformation(stocks[i],Time.getTime(),-14); IndexInformation[] indexinfo= (IndexInformation[])indexList.toArray(new StockMarketInformation[0]); List rsiList = technical.getRSI(indexinfo,null,14); RSI rsi = (RSI)rsiList.get(rsiList.size()-1); StockOrder stockOrder = null; if(rsi.getRsi()>0){    if(rsi.getRsi()>70){ stockOrder = new SimpleStockOrder(stocks[i],StockOrder.SELL);} else if(rsi.getRsi()<20){ stockOrder = new SimpleStockOrder(stocks[i],stockOrder.BUY);} else{ Holding holding = (Holding)holdingMap.get(stocks[i]);} if(holding != null){ if(holding.getNumber()>0){stockOrder = new SimpleStockOrder(stocks[i],StockOrder.SELL,holding.getNumber());} else{ stockOrder = new SimpleStockOrder(stocks[i],stockOrder.BUY,-holding.getNumber());} } break; } if(stockOrder != null){ investmentAgent.order(stockOrder); } } }

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

>if文に入る前にholdingの宣言をすれば良いですよね? 解決方法としてはそれで良いと思います。 「if(rsi.getRsi()>70){」の前で「Holding holding = null;」とすれば大丈夫です。 ただ、今回のエラーの原因はelseブロックを通るか否かの問題ではなく、変数holdingのスコープ(有効範囲)の問題です。holdingのスコープの外でholdingの値を参照している事が問題なのです。変数のスコープについて勉強する事をお勧めします。

tornader
質問者

お礼

返事が遅くなって申し訳ありません。gimmickさんの回答のおかげで解決しました。ありがとうございました。

その他の回答 (1)

noname#86752
noname#86752
回答No.1

elseを通らなければholdingが使えるようになりません。 しかし次のif文はelseを通るかどうかに関わらずholdingを見ようとしています。

tornader
質問者

補足

if文に入る前にholdingの宣言をすれば良いですよね?

関連するQ&A

  • javaのプログラムについて

    初めまして。java初心者のものです。 コンピュータとじゃんけんをするというプログラムをつくりたいのですが、 コンパイルしたところ、次のようなエラーが出ました。 「シンボルが見つかりません。」 どこをどう直せばよいのでしょうか。お教え願います。 以下が私のプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.applet.AudioClip; class Zyanken extends YJFrame implements ActionListener{ JButton[] btn; JPanel panel; Zyanken(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ panel.setText("COMはグーです。"); } else if(com==2){ panel.setText("COMはチョキです。"); } else{ panel.setText("COMはパーです。"); } if(e.getSource()==btn){ if(com==1){ panel.setText("あいこです。"); } else if(com==2){ panel.setText("あなたの勝ちです。"); } else{ panel.setText("あなたの負けです。"); } } else if(e.getSource()==btn){ if(com==1){ panel.setText("あなたの負けです。"); } else if(com==2){ panel.setText("あいこです。"); } else{ panel.setText("あなたの勝ちです。"); } } else{ if(com==1){ panel.setText("あなたの勝ちです。"); } else if(com==2){ panel.setText("あなたの負けです。"); } else{ panel.setText("あいこです。"); } } } } 大変恐縮ですが、よろしくお願いします。

  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java
  • プログラムを実行させたいのですが・・・・・

    複数のMP3ファイルからタグ情報を取り出すプログラムなのですがMainクラスを実行すると引数にディレクトリを指定してと表示されてしまいます。どの箇所の引数にディレクトリのパスを記述すれば取り出せるのかご教授お願い致します。直、プログラム大きく分けて6つあります。      <ID3V1Infoクラス>      <ID3V2Infoクラス>      <MP3FileクラスID3TagのVer1.0/1.1とVer2.3 取得クラスを取得・保持するクラス>      <MP3InfoクラスID3TagのVer1.0/1.1とVer2.3 取得クラスのスーパークラス>      <MP3FileListMainクラスMainクラス>       <FileListクラス指定ディレクトリ以下のファイル一覧を取得するクラス>のプログラムは以下のようになります。 /** * ID3Tag取得プログラム:FileListクラス * 指定ディレクトリ以下のファイル一覧を取得するクラス */ import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; public class FileList { private ArrayList objMp3FileList = null; private ArrayList objDirList = null; private File objFile_; public FileList(File objFile) { objFile_ = objFile; } public long getFileInfo() throws UnsupportedEncodingException { if(objFile_ == null) { System.out.print("Argment is null.\n"); return -1; // error } String strCurrentPath = objFile_.toString(); if(!objFile_.isDirectory()) { System.out.print("This Path is not Directry. :" + strCurrentPath + "\n"); return -1; } objMp3FileList = new ArrayList(); objDirList = new ArrayList(); for(int i = 0; objFile_.listFiles().length > i; i++) { if(objFile_.listFiles()[i].isDirectory()) { FileList objFileList = new FileList(objFile_.listFiles()[i]); objFileList.getFileInfo(); objDirList.add(objFileList); } else if(objFile_.listFiles()[i].isFile()) { MP3File objMP3File = new MP3File(objFile_.listFiles()[i]); objMP3File.getMP3Info(); objMp3FileList.add(objMP3File); } } return 0; } public Iterator getMP3FileIte() { return objMp3FileList.iterator(); } public Iterator getDirIte() { return objDirList.iterator(); } public String getDir() { return objFile_.getPath(); } }

    • ベストアンサー
    • Java
  • JAVAのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • CSVファイルから特定の文字列を含む行を出力

    CSVファイルを読み込み、特定の文字列を含む行を出力するプログラムを作成しています。 出力メソッドを作り、呼び出したいのですがうまくいきません。 コンパイルは通りますが出力したファイルには何も書き込まれていない状況です。 ヒントだけでも頂けると幸いです。 よろしくお願いします。 import java.io.*; import java.util.*; public class Test{ static String[] data; static BufferedWriter writer = null; public static void main(String[] args) throws Exception { String line; BufferedReader reader = null; reader = new BufferedReader(new FileReader("Week.csv")); writer = new BufferedWriter(new FileWriter("New.csv")); while (reader.ready()) { line = reader.readLine(); if (line.contains("氏名")) { create(line); } else if (line.contains("月")) { create(line); } else if (line.contains("水")) { create(line); } else if (line.contains("金")) { create(line); } } } //メソッド static void create(String line) throws Exception { data = line.split(","); for (int i = 0; i < data.length; i++) { writer.print(data[i]); writer.println(); } } }

    • ベストアンサー
    • Java
  • 辞書検索プログラムの続きです。

    void read_dic() { char eng2[20], jp2[40]; FILE *fp; int i=0; if((fp=fopen("dic.txt", "r"))==NULL) { printf("\n ファイルがありません\n"); exit(1); } else { printf("読み込み中...\n"); while (!feof(fp)) { fscanf(fp, "%s %s", eng2, jp2); strcpy(table[i].eng, eng2); strcpy(table[i].jp, jp2); i++; if(i>=100){ printf("辞書のテーブルがいっぱいです\n"); fclose(fp); exit(1); } } fclose(fp); printf("読み込み終了\n"); n = i; } } int hash(char *tango) { int h=0,p=256; while (*tango!='\0') { h = h*p + *tango; h = h%BUCKET_SIZE; tango++; } return(h); } struct cell *find(char *tango) { int a; struct cell *q; a=hash(tango); if(bucket[a].chain==NULL) return NULL; else{ q=bucket[a].chain; while ((strcmp(q->eng,tango))!=0){ if(q->next==NULL) return NULL; else q=q->next; } return q; } } 以前の投稿は http://oshiete1.goo.ne.jp/kotaeru.php3?qid=109202

  • javaプログラムについて

    javaのプログラムで入力項目をDBに書き込むというプログラムを作成しているのですが、 コンソール形式だと成功するのですが、テキストボックスなどをおいて、GUI形式でやろうとするとキーイベントの中の変数ににうまく値が参照されません 以下ソース import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import java.awt.Container; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; class meibo3 extends JFrame implements KeyListener { public static void main(String args[]) { meibo3 frame = new meibo3("タイトル"); frame.setVisible(true); } // private String name; // private String shu; // private int id; // private int su; meibo3(String title) { setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setLayout(null); JLabel lmeibo = new JLabel("【名簿入力】", SwingConstants.CENTER); lmeibo.setBounds(100, 10, 80, 30); JLabel lgakuno = new JLabel("学生番号", SwingConstants.CENTER); lgakuno.setBounds(30, 40, 80, 30); JLabel lname = new JLabel("氏 名", SwingConstants.CENTER); lname.setBounds(200, 40, 80, 30); JLabel lshu = new JLabel("入力を終了しますか?(Y/N)"); lshu.setBounds(30, 120, 200, 30); JTextField gaku = new JTextField(4); gaku.setBounds(30, 70, 80, 30); JTextField namae = new JTextField(20); namae.setBounds(200, 70, 80, 30); JTextField y = new JTextField(20); y.setBounds(200, 120, 20, 30); y.addKeyListener(this); ; p.add(lmeibo); p.add(lgakuno); p.add(lname); p.add(gaku); p.add(namae); p.add(y); p.add(lshu); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); int id = Integer.valueOf(gaku.getText()).intValue(); String name = namae.getText(); int nsu = namae.getText().length(); String yn =y.getText(); //method(id,name,nsu,yn); } public void keyPressed(KeyEvent ke) { // TODO 自動生成されたメソッド・スタブ if (ke.getKeyCode() == ke.VK_ENTER) { //private void method(int id, String name, int nsu, String yn){ Date d = new Date(); SimpleDateFormat dfd = new SimpleDateFormat("yyyy-MM-dd"); Connection con = null; String day = dfd.format(d); // System.out.print(day); PreparedStatement ps = null; try { // ドライバクラスをロード Class.forName("com.mysql.jdbc.Driver"); // データベースへ接続 con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/hellodb", "root", "root"); Statement stmt = (Statement) con.createStatement(); // name,bloodType,ageのデータを検索するSQL文を作成 String sql = "INSERT INTO hellodb.meibo VALUES(" + id + ",'" + name + "','" + day + "');"; System.out.println(sql); if (id > 4 && nsu > 20) { // JOptionPane.showMessageDialog(this, "学生番号が4桁以上、氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (id < 5) { // JOptionPane.showMessageDialog(this, // "学生番号が4桁以上になっています", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (nsu > 20) { // JOptionPane.showMessageDialog(this, // "氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (yn.equals("y") || yn.equals("y") || yn.equals("Y") || yn.equals("Y")) { // ps = con.prepareStatement(sql); stmt.execute(sql); // JOptionPane.showMessageDialog(this, // "成功しました", "Info", // JOptionPane.INFORMATION_MESSAGE); } else if (yn.equals("n") || yn.equals("n") || yn.equals("N") || yn.equals("N")) { } } } } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { // close処理 if (ps != null) { ps.close(); } // close処理 if (con != null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } public void keyReleased(KeyEvent arg0) { // TODO 自動生成されたメソッド・スタブ } public void keyTyped(KeyEvent arg0) { // TOD

  • プログラムからメソッドを呼び出したいのですが

    今、ArtName.javaのプログラムにM_data.javaのプログラム内のメッソドを呼び出したいのですがコンパイルするとエラーになってしまいます。どのように記述すればメッソドを呼び出すことができるかご教授お願いたします。 以下がプログラムになります。 /*ArtName.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class ArtName{ public static void an(String[] arg){ int i,j,number,song; char artname[]=new char[song]; M_data.music(); number=1; for(i=0;i<song;i++){ for(j=0;j<song;j++){ if(TagInfo[i]!=TagInfo[j]){ number++; } } } } } /*M_data.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class TagInfo{ final private String name; final private int pos; final private int len; public TagInfo(String name,int pos,int len){ this.name=name; this.pos=pos; this.len=len; } public String getName() { return name; } public int getPos() { return pos; } public int getLen() { return len; } } public class M_data { private static byte[] copyOfRange(byte b[],int pos, int len){ byte[] a=new byte[len]; System.arraycopy(b,pos,a,0,len); return a; // return java.util.Arrays.copyOfRange(b,pos,pos+len); } static void music() { File file = new File("C:/Users/NEC-PCuser/Downloads/ Answer .mp3"); FileInputStream fis=new FileInputStream(file); String charsetName="Shift_JIS"; //if(1<args.length) charsetName=args[1]; FileChannel fc=fis.getChannel(); fc.position(fc.size()-128); byte[] b=new byte[128]; if(fis.read(b)==128 && b[0]=='T' && b[1]=='A' && b[2]=='G'){ TagInfo[] infos={new TagInfo("Song title:",3,30),new TagInfo ("Artist:",33,30)}; int i=0; /*以下のfor文です*/ for(TagInfo info: infos){ System.out.print(i + info.getName()); System.out.println(new String(copyOfRange(b,info.getPos (),info.getLen()),charsetName)); i++; } } } public static void main(String[] args) throws IOException{ music(); } } ArtName.javaをコンパイルすると Artname.java:17シンボルが見つかりません。 シンボル:ArtNameのクラス        if(TagInfo[i]!=TagInfo[j]{ とエラーになります。どのように記述すればコンパイルできるかお教えてください。 よろしくお願いいたします。

  • プログラムからメソッドを呼び出したいのですが

    今、ArtName.javaのプログラムにM_data.javaのプログラム内のメッソドを呼び出したいのですがコンパイルするとエラーになってしまいます。どのように記述すればメッソドを呼び出すことができるかご教授お願いたします。 以下がプログラムになります。 /*ArtName.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class ArtName{ public static void an(String[] arg){ int i,j,number,song; char artname[]=new char[song]; M_data.music(); number=1; for(i=0;i<song;i++){ for(j=0;j<song;j++){ if(TagInfo[i]!=TagInfo[j]){ number++; } } } } } /*M_data.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class TagInfo{ final private String name; final private int pos; final private int len; public TagInfo(String name,int pos,int len){ this.name=name; this.pos=pos; this.len=len; } public String getName() { return name; } public int getPos() { return pos; } public int getLen() { return len; } } public class M_data { private static byte[] copyOfRange(byte b[],int pos, int len){ byte[] a=new byte[len]; System.arraycopy(b,pos,a,0,len); return a; // return java.util.Arrays.copyOfRange(b,pos,pos+len); } static void music() { File file = new File("C:/Users/NEC-PCuser/Downloads/ Answer .mp3"); FileInputStream fis=new FileInputStream(file); String charsetName="Shift_JIS"; //if(1<args.length) charsetName=args[1]; FileChannel fc=fis.getChannel(); fc.position(fc.size()-128); byte[] b=new byte[128]; if(fis.read(b)==128 && b[0]=='T' && b[1]=='A' && b[2]=='G'){ TagInfo[] infos={new TagInfo("Song title:",3,30),new TagInfo ("Artist:",33,30)}; int i=0; /*以下のfor文です*/ for(TagInfo info: infos){ System.out.print(i + info.getName()); System.out.println(new String(copyOfRange(b,info.getPos (),info.getLen()),charsetName)); i++; } } } public static void main(String[] args) throws IOException{ music(); } } ArtName.javaをコンパイルすると Artname.java:17シンボルが見つかりません。 シンボル:ArtNameのクラス        if(TagInfo[i]!=TagInfo[j]{ とエラーになります。どのように記述すればコンパイルできるかお教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう