質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Java

    13753questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

エラーがどうしても消せません

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 353

sanchu52

score 140

コードの下の行if,else文のところで、以下のエラーがでます。
いろいろ検討しましたが、どうしても解決できないので、
ご教授をお願いいたします。

c:\java_sample\chap01>javac Arith.java
Arith.java:29: エラー: ')'がありません
System.out.println(x + "と" + y "は同じ"); //差の絶対値を計算
^
Arith.java:31: エラー: ')'がありません
System.out.println(x + "と" + y "は違う");
^
エラー2個

コード
//Arith.java

public class Arith{

     public static void main(String[] args){

         int a=12,b=5;       
         System.out.println(a+b);

         System.out.println(a-b);    

         System.out.println(a*b); 

         System.out.println(a/b);

         System.out.println(a%b);

         //整数はオーバーフローする
         System.out.println(100000*100000); //結果は1410065408

         //実数演算では誤差がでる
         System.out.printf(7.0 * 0.8); //結果は5.60000_00000_0000_005

         //実数の比較
         double x = 5.6;
         double y = 7.0 * 0.8;

         if(Math.abs(x-y) < (0.000001)){    
             System.out.println(x + "と" + y "は同じ"); //差の絶対値を計算
         }else{
             System.out.println(x + "と" + y "は違う");
         }
     }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+8

どう修正すればよいかは既に回答がついているとおりです。
どう推測するかについて少し書いてみます。(Javaだけでなく他の言語でも大差ない問題についてです)

いろいろ検討しましたが、どうしても解決できない

おそらく初心者の多くの方がエラーメッセージを見ないまたは、見ても何言ってるんだかわからないということが多いだろうと思います。しかし経験を積んでもコンパイルエラーというのは結構うっかりが原因で出ちゃいます。そのエラーメッセージが何を伝えようとしているかを把握することは大事です。

「')'がありません」とは?

Arith.java:29: エラー: ')'がありません
  System.out.println(x + "と" + y "は同じ"); //差の絶対値を計算
                                 ^ <==この記号の位置に着目


')'がありませんと言われても「閉じ括弧ちゃんと書いてあるじゃない」と思うかもしれません。しかし着目すべきは^という記号(Javaでは排他的論理和の演算子記号として使われてますね)の位置です。

コンパイラーは^の位置(yの次)にあるべきトークン(言語を構成する単語・記号)として

  • )がくればprintlnの実引数の終わりを示す
  • (がくればyをメソッド名と解釈してそのメソッドへの実引数の指定が始まる
  • +-*/ ...などの演算子がくれば計算式がまだ続く

...

という具合に有り得るトークンの全てが分かっています。人間から見れば「うわーそんな細かいことを見ながらやってんの?」なんて感じますが、コンパイラーは機械ですので人間のように大局的に判断するのは得意じゃないんですね。「yの次に有り得るのは)(+-か...」なぁんて退屈な考え方でできてるのです。

このメッセージを見た時どう認識すべきかというと「')'がないのが問題」ではなく「')'があれば辻褄があうけど、どう頑張ってもつじつまが合わないトークン(この場合は文字列リテラル"は同じ")を書いてしまってるのが問題」と思わなければなりません。

じゃぁなんだったら許されるのか」と考えれば「あ・・・演算子の+を書き忘れてるわい」と気づけるはずです。

「間違っているトークン」を指摘されても「なぜ間違っているかわからない」のでしたら・・・それはその言語の文法の理解が不足しすぎている証拠で、本来は文法規則に戻って学習すべきです。ただ言語仕様書(の構文ルールの部分)を読んで自己解決するのは初心者の方には敷居が高く、さりとて参考書に体系的に分かり易く構文規則が説明してあるわけでもないので、質問で解決したくなるのはやむなしかも知れません。

しかし本件の場合は目の付け所さえ分かっていれば簡単に発見できたはずと思います。


ちなみにkatoyさんがやっておられますが、IDE(EclipseとかIntelliJとかNetbeansとか)でコーディングするともっと分かり易くなります。

質問者さんが見落としたであろう「誤っているトークンの位置」については「まずいトークンのところに赤い波線が表示される」ため見やすくなってます。初心者の方にとって「エラーの箇所(トークンの位置)がエディターで編集中にすぐにわかる」というIDEの特徴は非常に有用だと思います。

(地味な点ですが、「printfじゃなくてprintlnの間違い」といった意味的な間違いが、構文レベルのエラーがある段階でちゃんと表示されていることも賢いですね。javacは構文レベルのエラーがあると意味エラーをチェックする前にコンパイルをあきらめちゃいます)

IDEをセットアップしたり使いこなす自信がないという不安があるなら無理にお勧めはしませんが、一度IDEを使うと自分でjavacを起動するのがあほらしくなるぐらい有効なのは間違いないです。ある程度本気で取り組もうとするならIDE入れた方がいいんじゃないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 12:34

    つっても [ x "と" y "は同じ" ] で 文字列結合してくれる言語もいるから
    意図した結合か意図しない結合じゃないかを区別するための処置だったきもしないでもない

    キャンセル

  • 2018/04/26 13:45 編集

    文字列リテラルについていえば、それを列挙できるような言語(C++とかpythonとかその他)では構文規則にちゃんと

    string-literal: quated-string-literal+

    なんてふうに厳密に定義されていると思います。コンパイラーは曖昧な構文は処理できませんのでガチガチに定義されてますよね。

    コンパイラーが間違ったコードを見て本来何を意図していたかを推測するのは(構文が複雑な言語であるほど)大変難しいので「読んでズバリわかるエラーメッセージ」を出すのは難しいです。ただ質問者さんに伝えたかったのは、多少なりともそういう特徴を把握しておけばメッセージから原因を突き止めやすくなるんじゃないかなぁということでした。

    キャンセル

  • 2018/04/26 19:49

    丁寧な説明ありがとうございます。まちがいが見つけられなくて質問しました。
    何回かみなおしたのですが、yのあとの+が抜けていたんですね。
    eclipseは設定すみで時々利用しています。ゴールデンウイークにeclipseを使ったJAVAのプログラミング
    の勉強をしようかと思っています。

    キャンセル

+5

System.out.println(x + "と" + y "は同じ"); → System.out.println(x + "と" + y + "は同じ");

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 20:03

    ありがとうございます。

    キャンセル

  • 2018/04/26 20:32

    こういうミスは、けっこうやります^^; Cなどで構文エラーなんかやろうものなら20〜30のエラーがでます。...てか、“エラーが多すぎてコンパイルできないから、ここで終わり”みたいな事をコンパイラに言われますw。また、その時は、KSwordOfHasteさんが言われているように「つじつまが合わなくなった所で出る」ので実際のエラーとはかけ離れたエラーに見えることもあります。....その辺は、経験を積むしかないのかとも思いますが、まずエーメッセージをよく読むようにしましょうそして、推測する力を付けましょう。

    キャンセル

  • 2018/04/27 06:59

    ありがとうございます。私はせっかちで、いくら近辺を探しても単純みすを見つけられないときに、
    皆さんのお力をお借りしています。これからもよろしくお願いいたします。

    キャンセル

  • 2018/04/27 08:39

    参考までに...https://qiita.com/Mic-U/items/f9de1c08c47c50620905

    キャンセル

  • 2018/04/27 10:40

    さっそく御参考のURLを拝見しました。私はc言語を勉強して多くの事を学び、教えて頂きました。
    大体はURLに書いてあることはできるようになりましたが、まだまだ初心者です。
    これからもよろしくおねがいいたします。

    キャンセル

+5

eclipse に コードを paste して、エラー箇所を確認しました。

イメージ説明

編集して、エラーを解消させてみました。

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 20:03

    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    getMethod、invokeの第2引数について

    こんなクラスがあったとします。 class Test { private Double A; private Integer B; private

  • 解決済

    Java エラー 初心者

    public class part01 { public static void main( String[] args ) { String name =

  • 解決済

    初期化メソッドのスマートな書き方

    現在,プログラム内に次のような,int型配列とdouble型配列の全ての要素に0を入れる(初期化する)というメソッドを書いています. 見てわかる通り,非常に冗長な書き方です.簡潔

  • 解決済

    このプログラムを作りたいです。エラーが出ます。

    2次元配列や1次元配列を使って以下のプログラムを作りたいのですがコンパイルエラーがでます。 国語 数学 英語 社会 理科 | 平均点 青木 50 90 76

  • 解決済

    Javaでそれぞれの英単語のTFIDFの求め方がわかりません。

    Javaを独学で勉強中のJava初心者です。Javaで英文テキストファイルを読み込みそれぞれの英単語のTFIDFを表示させるプログラムを作りたいのですが、どうしてもうまくできません

  • 解決済

    CSVからデータを取得して検索した文字列のみを表示したい

    プログラム初心者です。 Javaを勉強中で、質問があります。 CSVからデータを取得し、取得したデータの中から検索した文字列のみを表示するプログラムを作りたいです。

  • 受付中

    ジャンケンゲーム

    ジャンケンゲームを作ってます。 <ルール> コンピュータに3回負けたらゲーム終了! 負けるまでゲームは続く! 数字を入力するとループが止まりません。 あと、winlo

  • 解決済

    ループ文の終了について

    数当てゲームで正解した時にプログラムを終了させたいのですが終わることができません。 初歩的なことで申し訳ありませんがお力添えをおねがいします。 public class N

同じタグがついた質問を見る

  • Java

    13753questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。