Метод System.in.read()
Ниже приведен код, который я написал, чтобы получить два ввода от пользователя. Но когда я запускаю программу, она берет только один вход, генерирует другой самостоятельно и вычисляет неправильное значение. пожалуйста помоги. Спасибо
import java.io.IOException;
import java.util.*;
class ThrowsExcpt {
int divide(int x, int y) throws ArithmeticException, IOException {
return x / y;
}
}
class ThrowsTemps {
public static void main(String s[]) throws IOException {
int x = System.in.read();
int y = System.in.read();
ThrowsExcpt th = new ThrowsExcpt();
int r = th.divide(x, y);
System.out.println(r);
}
}
7 ответов
System.in
является InputStream
- read()
читает ровно один байт Ваш прямой ввод более одного байта, поэтому оба значения непосредственно считываются в первом входе.
Вместо этого используйте сканер (с System.in в качестве входных данных):
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
Дополнительные примеры: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html
Читать () метод.
Читает следующий байт данных из входного потока. Байт значения возвращается как целое число в диапазоне от 0 до 255. Если байт не доступен, поскольку достигнут конец потока, возвращается значение -1. Этот метод блокируется до тех пор, пока не будут доступны входные данные, не будет обнаружен конец потока или сгенерировано исключение.
от http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html.
Так что используйте scanner
за это.
И в соответствии с вашим вопросом, почему он не запрашивает второй ввод? Причина в том, что метод read() ожидает входной источник, как только он получает входные данные, он получает байты от этого входного источника. Например:
inChar = System.in.read();
i = System.in.read();
i1 = System.in.read();
System.out.print("You entered ");
System.out.println(inChar);
System.out.println(i);
System.out.println(i1);
вы входите abc
в качестве входных данных вы получите
Enter a Character:
abc
You entered 97
98
99
как указано выше, это байтовые значения a, b и c.
Пояснение: ввод abc
байтовый массив
+--------------------+
| 97 | 98 | 99 | other byte value for **Enter**
+--------------------+
первый System.in.read() получит первый индекс массива, второй получит второй и так далее.
Попробуйте использовать объект Scanner, чтобы прочитать ввод вашего пользователя:
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
Почему происходит нежелательное назначение?
Символы ввода с клавиатуры сохраняются в буфере ввода после нажатия клавиши ENTER. ENTER включает перевод строки \ n во входной символ. Десятичное / целочисленное значение перевода строки '\n' равно 10.
System.in.read() читает только первый символ из входных символов, символ преобразуется в целое число и возвращает его. И этот символ будет исключен из буфера ввода.
Остальные символы все еще ожидают во входном буфере, пока он не будет прочитан System.in.read() таким же образом, как указано выше.
int inputchar1, inputchar2, inputchar3;
System.out.print("input: ");// input: 43
// The line feed '\n' is generated when ENTER is pressed.
// '4', '3' and '\n' are in the input buffer.
inputchar1 = System.in.read(); // '4' is read and returns 52 (corresponding integer value)
// '3' and '\n' is in the input buffer.
inputchar2 = System.in.read(); // '3' is read and returns 51
// '\n' is pending in the input buffer.
inputchar3 = System.in.read(); // '\n' is read and returns 10
// no more input character in the input buffer.
System.out.println("inp1 =" + inputchar1);
System.out.println("inp1 =" + inputchar2);
System.out.println("inp1 =" + inputchar3);
/*
* Refer to ASCII table for char to decimal conversion.
* Although java Char is 16-bit unicode ASCII is still applicable.
*/
Как избежать нежелательного назначения?
Продолжайте читать содержимое входного буфера, пока он не будет исчерпан.
int x, y, avoid;
System.out.println("Enter x: ");
x = System.in.read();
// Reading all the characters after the first character so that
// no character stays pending in the input buffer.
do {
avoid = System.in.read();
} while(avoid != '\n');
System.out.println("Enter y: ");
// New input buffer is created.
y = System.in.read();
do {
avoid = System.in.read();
} while(avoid != '\n');
Ссылка: "Java: руководство для начинающих 6e" - Герберт Шильдт
Эй, братан, это должно работать на то, что вам нужно, я думаю, если это не, дайте мне знать
import java.io.IOException;
import java.util.Scanner;
public class noob{
class ThrowsExcpt {
int divide(int x, int y) throws ArithmeticException, IOException {
return x / y;
}
}
class ThrowsTemps {
public void main(String s[]) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.println("Enter number 1");
int x = sc.nextInt();
System.out.println("Enter number 2");
int y = sc.nextInt();
Если вы используете консоль, попробуйте это:
int x = Integer.parseInt(System.console().readLine());
int y = Integer.parseInt(System.console().readLine());
Проще говоря -
int x = System.in.read();
автоматически выдает исключение.
- Вы выделили и определили ячейку памяти для хранения int, а затем присвоили байт для хранения там. Пересмотрите ввод или используйте diff. Метод ввода.