возвращает логическое значение или исключение из метода

#java

Вопрос:

Я изучаю Java и застрял. У меня есть эта функция:

    class MemberAction{

   public static Object removeMember(Member m){
   
        try {
            //do stuff here that possibly throw the exception
            //if nothing is wrong, return true
            return true;
        } catch (IllegalStateException e){
            return e;
        }
    }
 }
 

тогда назови это так:

   Object actionResult = mActions.removeMember(m);
  if(actionResult.equals(true)){

  }else{

  }
 

это выглядит немного странно, и мне интересно, есть ли лучший способ сделать что-то подобное. Методы MemberAction возвращают исключение или примитивное значение (некоторые могут быть числами или строками), поэтому мой подход «равно» (true) не всегда будет работать.

Каков был бы хороший способ создать функцию, которая может возвращать примитивные данные или исключение, а затем проверять, каков был ответ в хорошем смысле?

Комментарии:

1. Вам не нужно возвращать исключение, вместо этого возвращайте значение false. Если вы хотите обработать исключение рядом с ActionResult, выбросьте e вместо возврата e.

2. Вы хотите вернуть логическое значение из метода removeMember?

3. @aksappy я рассматривал это, но мне нужно поместить исключение в какой-нибудь файл журнала, что я мог бы сделать в самом методе, но не мог не задаться вопросом, возможно ли что-то подобное, поэтому класс MemberAction на самом деле мало что знает об остальной части приложения. Я занимаюсь исключительно учебой.

4. Методы возвращают значение определенного типа или ничего, но выдают исключение, если что-то пойдет не так. Никогда не видел метода, возвращающего исключение, хотя, я думаю, это возможно,

5. На чистой Яве вы этого не делаете. Вы возвращаете тип и создаете исключения. Если вы исходите из функционального фона, вы могли бы использовать Either<Exception,Boolean> тип из библиотеки Vavr, возможно, для представления 2 возможных возвратов.

Ответ №1:

Вы не должны возвращать исключение из функции. Вместо этого вы должны throw это сделать. Но поскольку ваш код в функции уже может вызвать исключение, вам ничего не нужно делать:

    public static boolean removeMember(Member m){
        //do stuff here that possibly throw the exception
        //if nothing is wrong, return true
        return true;
    }
 

Теперь, когда вы вызываете метод, выполните try...catch :

   
  try {
    actionResult = mActions.removeMember(m);
    // do something with actionResult
  }catch{
    // remove failed
  }
 

В качестве альтернативы вы можете обработать исключение в removeMember() , но вернуть false :

    public static boolean removeMember(Member m){
   
        try {
            //do stuff here that possibly throw the exception
            //if nothing is wrong, return true
            return true;
        } catch (IllegalStateException e){
            return false;
        }
    }
 

Обратите внимание, что каждое возвращаемое значение должно иметь один и тот же тип. Не стоит объявлять Object в качестве возвращаемого типа, чтобы возвращать вещи совершенно разных типов.

Это дает преимущество, которое теперь вам не нужно сравнивать if(actionResult.equals(true)) . Вместо этого вы можете просто использовать if(actionResult) , так actionResult как это логическое значение.

Комментарии:

1. Хорошее решение. Хотя так и должно быть public static **boolean** removeMember(Member m){ , если вы можете обновить это, чтобы не вызвать у кого-то стресса и недоумения; -) Никогда не возвращайте объект из-за плохих намерений; будьте как можно более конкретны при возврате вещей, когда вы можете помочь этому.

2. @JayC667 Спасибо за предложение. Для дополнительной справки не стесняйтесь редактировать ответы напрямую, чтобы исправить такие упущения.

Ответ №2:

Много думаю, что вам нужно сделать здесь, я привел пример неправильного пути к файлу для загрузки, который покажет исключение, но, наконец, он вернет значение true из finally

 import java.io.*;
public class Test {
public static Boolean Method_B() {
    try {
        System.out.println("Main working going..");
        File file = new File("./nofile.txt");
        FileInputStream fis = new FileInputStream(file);
    } catch (IOException e) {
        // Exceptiona handling
        System.out.println("No file found ");
    } catch (Exception e) {
        // Exceptiona handling
        System.out.println(e);
    } finally {
        return true;
    }
}
public static void main(String args[]) {
    if (Test.Method_B()) {
        System.out.println("Show true ans");
    } else {
        System.out.println("Sorry error occure");
    }

}
}
 

Ответ №3:

Ты можешь:

 public static Boolean removeMember(Member m) {
   
    try {
        //do stuff here that possibly throw the exception
        //if nothing is wrong, return true
        return true;
    } catch (IllegalStateException e) {
        return false;
    }
}
 

Тогда вы могли бы использовать вот так:

 if (actionResult.removeMember(m)) {

} else {
            
}
 

Возможно, если вы дадите нам дополнительную информацию о том, нужен ли вам ваш метод для возврата логического значения или типа исключения, или даже того и другого, мы могли бы предложить лучшую версию метода. Может быть, что-то вроде этого:

 public static Object[] removeMember(Member m) {
    try {
        //do stuff here that possibly throw the exception
        //if nothing is wrong, return true
        return new Object[] {true, null};
    } catch (Exception e){
        return new Object[] {false, e};
    }
}
 

Имейте в виду, что в моем последнем примере я больше не возвращаю логическое значение, поэтому мой предыдущий if не сработает. Но вы могли бы легко получить доступ как к логическому, так и к любому другому объекту, возвращаемому методом, просто:

 Object[] ob = actionResult.removeMember(m);
    System.out.println(ob[0]   " "   ob[1]);
 

Ответ №4:

Существует несколько методов, связанных с операциями удаления в ООП,

  1. Вы можете вернуть элемент, который был удален внутри Optional объекта, где позже вы сможете оценить .present() свое состояние. Это потребует от вас молчаливой обработки исключения, вызванного ошибкой, но вы ДОЛЖНЫ зарегистрировать ошибку и вернуть пустой Optional объект. -> Мы можем видеть это в большинстве интерфейсов CRUD.
  2. Вы можете вернуть логическое false значение в блоке catch, но для этого также потребуется зарегистрировать сообщение об исключении. -> это лучшая практика, если вы хотите избежать прерывания потока, как в приложениях пользовательского интерфейса.
  3. Вы можете просто повторно создать исключение и заставить вызывающую функцию перехватить его, в этом случае вам придется выбирать:
    • Определенная throws в вашей функции, которая заставит вызывающего абонента перехватить ее во время компиляции, это называется проверенным исключением, если вы считаете, что ошибка здесь является фатальной.
    • Создайте исключение RuntimeException с непроверенным исключением и передайте его вызывающему объекту во время выполнения.

    -> Обычно встречается в реализациях API, где вы хотите предоставить вызывающему абоненту свободу обработки вызова