LoginSignup
shica
@shica (か し)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java エラーを治す方法を教えてください

Q&AClosed
static List<String> p_notation = new ArrayList<String>();

public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ

    Scanner scan=new Scanner(System.in);
    String s=scan.next();

    try {
        int cnt=0;
        if(Character.isLetter(s.charAt(cnt))){
            cnt+=1;
            while(Character.isLetter(s.charAt(cnt)))
                cnt+=1;
        }else {
            throw new ArithmeticException("入力エラー");
        }
        String var=""; //変数のみ
        var+=s.substring(0,cnt);

        String[] fomula; //'='と変数以外
        fomula=split_infix(s.substring(cnt+1,s.length()));

        E(fomula); //後置記法に変換
        System.out.println(p_notation);
        //listを配列にする
        String[] array = p_notation.toArray(new String[p_notation.size()]);
        System.out.println(var+"="+Keisan(array)); //計算結果の出力

    }catch(ArithmeticException e) {
        System.out.println(e);
        System.exit(1);
    }
}

public static String Keisan(String[] s) { //後置記法を計算
    // TODO 自動生成されたメソッド・スタブ
    Deque<String> stack = new ArrayDeque<>(); //スタック

    try {
        for(int i=0;i<s.length;i++) {
            if(s[i].equals("+")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a+b;
                stack.push(String.valueOf(sum));
            }
            else if(s[i].equals("-")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a-b;
                stack.push(String.valueOf(sum));
            }
            else if(s[0].equals("*")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a*b;
                stack.push(String.valueOf(sum));
            }
            else if(s[i].equals("/")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a/b;
                stack.push(String.valueOf(sum));
            }
            else {
                stack.push(String.valueOf(s[i]));
            }
        }
        System.out.println(p_notation);



    }catch(ArithmeticException e) {
        System.out.println("除算エラーです。");
        System.exit(1);

    }catch(Exception e) {
        System.out.println("式が不正です。");
        System.exit(1);
    }
    String st=stack.pop();
    return st;
}

public static void E(String[] s) {
    // TODO 自動生成されたメソッド・スタブ
    s=T(s);

    while(s!=null && s[0]=="+" || s[0]=="-") {
        List<String> list = Arrays.asList(s);
        String ch="";
        ch=""+s[0];
        list.remove(0);
        s=T(s=list.toArray(new String[list.size()]));
        p_notation.add(ch);
    }
}

public static String[] T(String[] s) {
    // TODO 自動生成されたメソッド・スタブ
    s=F(s);

    while(s!=null && s[0]=="*" || s[0]=="/") {
        List<String> list = Arrays.asList(s);
        String ch="";
        ch=""+s[0];
        list.remove(0);
        s=T(s=list.toArray(new String[list.size()]));
        p_notation.add(ch);
    }
    return s;
}

public static String[] F(String[] s) {
    // TODO 自動生成されたメソッド・スタブ

    List<String> list = Arrays.asList(s);

    if(Character.isDigit(s[0].charAt(0))) { //数値か判定
        p_notation.add(s[0]);
        list.remove(0);
        if(s.length!=1) {
            s=list.toArray(new String[list.size()]);
        }
        return s;
    }
    else if(s[0]=="(") {
        Deque<String> tmp = new ArrayDeque<>();
        Deque<String> stack = new ArrayDeque<>();

        stack.push(s[0]);
        list.remove(0);
        s=list.toArray(new String[list.size()]);

        while(stack.peek()!="") { //stackの中身があるならループ
            if(s[0]=="(") {
                stack.push(s[0]);
                list.remove(0);
                s=list.toArray(new String[list.size()]);
            }

            else if(s[0]==")") {
                stack.pop();
                list.remove(0);
                s=list.toArray(new String[list.size()]);
            }

            else {
                tmp.push(s[0]);
                list.remove(0);
                s=list.toArray(new String[list.size()]);
            }
        }
        E(tmp.toArray(s));
        return s;
    }
    return s;
}

public static String[] split_infix(String s) {
    // TODO 自動生成されたメソッド・スタブ
    String[] token=new String[s.length()];
    int idx=0;
    int cnt=0;

    while(true) {
        if(cnt==s.length()) break;

        else if(Character.isDigit(s.charAt(cnt))){ //数値か判定
            String tmp="";
            tmp+=s.charAt(cnt);
            cnt+=1;
            while(cnt!=s.length() && Character.isDigit(s.charAt(cnt))) {
                tmp+=s.charAt(cnt);
                cnt+=1;
            }
            token[idx]=tmp;
            idx+=1;
        }
        else {
            token[idx]=String.valueOf(s.charAt(cnt));
            cnt+=1;
            idx+=1;
        }

    }
    return token;
}

入力 x=1+2
実行結果
image.png

治し方教えてください。。。

0

1Answer

とりあえず実行するだけであれば、↓の部分を

public static String[] F(String[] s) {
    // TODO 自動生成されたメソッド・スタブ

    List<String> list = Arrays.asList(s);

↓のように修正してみてください。

public static String[] F(String[] s) {
    // TODO 自動生成されたメソッド・スタブ

    List<String> list = new ArrayList( Arrays.asList(s) );

修正前のコードでは、String[](固定配列)に紐づいたリストへの処理となるため、removeメソッドで要素を消すことができずに例外が発生します。ですので、要素を消せるように remove 可能なリストへ作り直しています。

また、実行時にでる例外ログにはヒントがつまっています。
例外がでた場合は慌てず騒がず、「言語+例外名+例外を投げたメソッド名」等でググってみましょう。

例えば、今回のケースだと、↓のような感じです。

java UnsupportedOperationException remove

参考になるページが見つかると思います。

1

Your answer might help someone💌