#java
#java
Вопрос:
Я пытаюсь узнать об обработке исключений. Кажется, я не могу получить String[] a = names(scnr); Чтобы выдать исключение за пределы границ, когда оно выходит за пределы 3 элементов. Я знаю, большинство людей ненавидят ошибку out of bounds, и я пытаюсь это сделать, и, хоть убейте, я не могу понять, что я делаю не так. Занимался этим весь день и гуглил всевозможные материалы. Но, похоже, я не могу найти именно то, что ищу. Поэтому я мог бы воспользоваться некоторой помощью и перспективой.
Итак, я ввожу полную строку, которую я разделяю (обрезаю и разбиваю) на основе запятых и пробелов, а затем части сохраняются в массиве (String []name), затем передаются в main для вывода с помощью String[] a . Таким образом, это не ошибка, когда я выхожу за пределы 3 элементов, независимо от того, как я это делаю. Я просто не могу отобразить ничего, кроме [4]. Но это не совсем то, что я пытаюсь сделать. Это мой первый класс Java, так что будьте нежны, ха-ха.
Есть предложения?
import java.util.*;
public class ReturnArrayExample1
{
public static void main(String args[])
{
Scanner scnr = new Scanner(System.in);
String[] a = names(scnr);
for (int i = 0; i < 3; i )
{
System.out.println(a[i] " in index[" i "].");
}
scnr.close();
}
public static String[] names(Scanner scnr)
{
String[] name = new String[3]; // initializing
boolean run = true;
do
{
try
{
System.out.println("Enter 3 names separated by commas ',':(Example: keith, mark, mike)");
String rawData = scnr.nextLine();
if(rawData.isEmpty())
{
System.err.println("Nothing was entered!");
throw new Exception();
}
else
{
name = rawData.trim().split("[\s,] ");
run = false;
}
}
catch(ArrayIndexOutOfBoundsException e)
{
System.err.println("Input is out of bounds!nUnsuccessful!");
}
catch(Exception e)
{
System.err.println("Invalid entry!nUnsuccessful!");
}
}
while(run == true);
System.out.println("Successful!");
scnr.close();
return name;
}
}
Комментарии:
1.
name = rawData.trim().split("[\s,] ")
присваиваетname
переменной новый массив. Исходный массив длины 3, на который ссылалась эта переменная, становится неактуальным. Новый массив может быть короче или длиннее 3.2. Итак, как мне это исправить?
3. @Eran Вот что я пытаюсь выяснить. Я в принципе хочу иметь возможность разделить / обрезать текущий массив и выдать ошибку, если она выходит за пределы 3 индексов для массива. Я просто не знаю, как я могу повлиять на это в своем коде.
4. Так что проверьте,
name.length > 3
ли это, и создайте исключение
Ответ №1:
Если я вас правильно понимаю, вы хотите вызвать исключение ArrayOutOfBoundsException, если names
массив не содержит ровно 3 элемента. Следующий код такой же, как тот, который вы написали с помощью if-инструкции, чтобы сделать именно это.
import java.util.*;
public class ReturnArrayExample1
{
public static void main(String args[])
{
Scanner scnr = new Scanner(System.in);
String[] a = names(scnr);
for (int i = 0; i < 3; i )
{
System.out.println(a[i] " in index[" i "].");
}
scnr.close();
}
public static String[] names(Scanner scnr)
{
String[] name = new String[3]; // initializing
boolean run = true;
do
{
try
{
System.out.println("Enter 3 names separated by commas ',':(Example: keith, mark, mike)");
String rawData = scnr.nextLine();
if(rawData.isEmpty())
{
System.err.println("Nothing was entered!");
throw new Exception();
}
else
{
name = rawData.trim().split("[\s,] ");
if (name.length != 3) {
throw new ArrayIndexOutOfBoundsException();
}
run = false;
}
}
catch(ArrayIndexOutOfBoundsException e)
{
System.err.println("Input is out of bounds!nUnsuccessful!");
}
catch(Exception e)
{
System.err.println("Invalid entry!nUnsuccessful!");
}
}
while(run == true);
System.out.println("Successful!");
scnr.close();
return name;
}
}
Комментарии:
1. Теперь я это вижу. однако это все еще не приводит к ошибке. @Eran выше упоминал, что эта часть name = RawData.trim().split(«[\s,] «) присваивает новый массив переменной name..
2. Для меня это ошибка, если бы я попытался просто ввести «кит, марк»
3. хм … значит, он работает с 3 именами, но не ниже. Я явно сделал что-то не так. Просто не уверен, что я сделал или как это исправить.
4.
OutOfBoundsException
означает, что вы пытаетесь получить доступ к элементу в позиции, выходящей за пределы массива, следовательно, за пределы. Если вы хотите, чтобы оно выдавало исключение OutOfBoundsException, когда у вас есть слишком большой массив (для чего на самом деле не было сделано исключение), вы должныthrow
сделать это специально.
Ответ №2:
Если вы хотите, чтобы Java выдавала исключение ArrayIndexOutOfBoundException, вы должны сохранить созданный names
экземпляр и позволить java скопировать массив в ваш массив имен:
String[] names=new String[3];
String[] rawElements=rawData.trim().split("[\s,] ");
System.arraycopy(rawElements, 0, names, 0, rawElements.length);
вывод:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at stackoverflow.OutOfBound.main(OutOfBound.java:8)
Ответ №3:
Насколько я понимаю, вы ожидаете исключение ( ArrayIndexOutOfBoundsException
) для строки thrown at name = rawData.trim().split("[\s,] ");
с аргументом, что размер массива ( name
) фиксирован на 3, и когда, если входные данные превышают 3, должно быть сгенерировано исключение; что не так.
Причина в том, как происходит присвоение в Java. При объявлении String[] name = new String[3];
в куче Java создается объект, а его ссылка присваивается переменной name
, которая находится в памяти стека. И когда эта строка name = rawData.trim().split("[\s,] ");
выполняется, в куче создается новый объект массива, и переменная name
начинает указывать на вновь созданный объект массива в куче. Примечание: старый объект станет доступным для сборки мусора через некоторое время. В конечном итоге это изменяет длину переменной массива ( name
), и вы не получаете никакого исключения ArrayIndexOutOfBoundsException.
Вы можете понять это более четко, распечатав объект на консоли, например, System.out.println(name);
после его инициализации и опубликовав его назначение.
Я также предложу вам перейти по этой ссылке (https://books .trinket.io/thinkjava2/chapter7.html#elements ) чтобы понять, как создаются, инициализируются и копируются массивы и т.д..
Код с командами system.out (для понимания)
import java.util.Scanner;
public class ReturnArrayExample1 {
public static void main(String args[]) {
Scanner scnr = new Scanner(System.in);
String[] a = names(scnr);
System.out.println("Variable (a) is referring to > " a);
for (int i = 0; i < 3; i ) {
System.out.println(a[i] " in index[" i "].");
}
scnr.close();
}
public static String[] names(Scanner scnr) {
String[] name = new String[3]; // initializing
System.out.println("Variable (name) is referring to > " name);
boolean run = true;
do {
try {
System.out.println("Enter 3 names separated by commas ',':(Example: keith, mark, mike)");
String rawData = scnr.nextLine();
if (rawData.isEmpty()) {
System.err.println("Nothing was entered!");
throw new Exception();
} else {
name = rawData.trim().split("[\s,] ");
System.out.println("Now Variable (name) is referring to > " name);
run = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Input is out of bounds!nUnsuccessful!");
} catch (Exception e) {
System.err.println("Invalid entry!nUnsuccessful!");
}
} while (run == true);
System.out.println("Successful!");
scnr.close();
return name;
}
}
Если вы хотите создать исключение, когда ввод больше 3, тогда есть много способов сделать это. Одно предложение от @mohamedmoselhy.com тоже прилично.