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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

解決済

3回答

2806閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/04/25 20:38

コードの下の行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 "は違う"); } } }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

どう修正すればよいかは既に回答がついているとおりです。
どう推測するかについて少し書いてみます。(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 00:26

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/26 03:34

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

2018/04/26 04:50 編集

文字列リテラルについていえば、それを列挙できるような言語(C++とかpythonとかその他)では構文規則にちゃんと string-literal: quated-string-literal+ なんてふうに厳密に定義されていると思います。コンパイラーは曖昧な構文は処理できませんのでガチガチに定義されてますよね。 コンパイラーが間違ったコードを見て本来何を意図していたかを推測するのは(構文が複雑な言語であるほど)大変難しいので「読んでズバリわかるエラーメッセージ」を出すのは難しいです。ただ質問者さんに伝えたかったのは、多少なりともそういう特徴を把握しておけばメッセージから原因を突き止めやすくなるんじゃないかなぁということでした。
退会済みユーザー

退会済みユーザー

2018/04/26 10:49

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

0

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

イメージ説明

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

イメージ説明

投稿2018/04/25 22:19

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/26 11:03

ありがとうございます。
guest

0

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

投稿2018/04/25 20:47

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/26 11:03

ありがとうございます。
cateye

2018/04/26 11:32

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

退会済みユーザー

2018/04/26 21:59

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

退会済みユーザー

2018/04/27 01:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問