Массив * исключение, не выходящее за пределы

#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 тоже прилично.