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

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

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

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

Q&A

解決済

1回答

1817閲覧

入力された文字列と数値で数値のみ計算し代入したいです

hirotaka2019

総合スコア11

Java

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

0グッド

0クリップ

投稿2019/07/02 02:54

入力された文字列と数値で数値のみ計算し代入したいです

Java(Eclips)を先月からやり始めまして、現在行っているプログラムが、入力された値が文字列で入力された場合でも計算ができるのか試していたのですが、どうにも上手くいかず整理ができなくなってしましました。

下記のような結果になってほしいのですが、エラーが出て進みません。

入力される値
入力する数:3
SET 1 10
SET 2 20
ADD 40

ADD 40 → 変数1の値を足して、変数2に代入

出力される値
変数1=10 
変数2=50

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -3
at java.lang.String.substring(Unknown Source)
at Main.Calculation(Main.java:20)
at Main.main(Main.java:15)

該当のソースコード

import java.util.*;

public class Main {
public static void main(String[] args) {
ArrayList<String> strList = new ArrayList<String>();

Scanner sc = new Scanner(System.in); int value = sc.nextInt(); for(int i = 0; i <= value;i++) { String line = sc.nextLine(); strList.add(line); Calculation(strList.get(i)); } } public static void Calculation(String line) { System.out.println(line.substring(3)); }

}

試したこと

初めは、リストを使わずに入力のみで文字列を取り出し数値に変換しようとしましたができず、リストに格納して一つずつ取り出そうとしましたができず、初めからやり直して、一つずつ確認をしていると序盤の方からダメなことに気づき今にいたります。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

fuzzball

2019/07/02 04:44

コードは ``` で囲って下さい。
guest

回答1

0

ベストアンサー

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -3

at java.lang.String.substring(Unknown Source)
at Main.Calculation(Main.java:20)
at Main.main(Main.java:15)

エラーの発生箇所が書いてありますね。
Calculationメソッドに、期待している引数が渡っているのか確認してみましょう。

Java

1public static void Calculation(String line) { 2 System.out.println(line); // 確認 3 System.out.println(line.substring(3)); 4}

質問の入力例に対しては、次のような出力が得られる筈です。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -3 at java.base/java.lang.String.substring(String.java:1841) at Main.calculation(prog.java:19) at Main.main(prog.java:13)

本来なら SET 1 10 が渡されて欲しいところですが、そうでないことが分かりますね。
入力部分に問題があることが推察されます。

原因と対策

Scanner#nextIntは、バッファに改行文字を食い残します。
解消する方法はいくつかありますが、次のように書くのが簡潔でしょう。

Diff

1- int value = sc.nextInt(); 2+ int value = Integer.parseInt(sc.nextLine());

Scanner#nextLineで改行文字まで丸々読み取ってから、数値に変換する方法です。

投稿2019/07/02 03:04

編集2019/07/02 03:13
LouiS0616

総合スコア35660

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

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

hirotaka2019

2019/07/02 04:11

LouiS0616さん 回答ありがとうございます。 なるほど!改行文字までまるまる読み取ることで数値に変換できるんですね。凄く勉強になりました。 ありがとうございます。
LouiS0616

2019/07/02 04:21 編集

『改行文字までまるまる読み取ることで数値に変換できる』のでは無くて、 『改行文字までまるまる読み取ることで、直後の読み取りを阻害しない』のです。 実際にどちらの方法でもvalueは期待通りに読み込めている筈です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問