たとえば、任意の数値(負、ゼロ、または正)を返すことができる関数を作成したいとします。
ただし、特定の例外に基づいて、関数がBoolean
FALSE
を返すようにしたい
int
or a Boolean
を返すことができる関数を書く方法はありますか?
わかりましたので、これは多くの応答を受けました。私は単に問題に間違って取り組んでいることを理解しており、メソッドで何らかの例外をthrow
する必要があります。より良い答えを得るために、私はいくつかのサンプルコードを提供します。面白がらないでください:)
public class Quad {
public static void main (String[] args) {
double a, b, c;
a=1; b=-7; c=12;
System.out.println("x = " + quadratic(a, b, c, 1)); // x = 4.0
System.out.println("x = " + quadratic(a, b, c, -1)); // x = 3.0
// "invalid" coefficients. Let's throw an exception here. How do we handle the exception?
a=4; b=4; c=16;
System.out.println("x = " + quadratic(a, b, c, 1)); // x = NaN
System.out.println("x = " + quadratic(a, b, c, -1)); // x = NaN
}
public static double quadratic(double a, double b, double c, int polarity) {
double x = b*b - 4*a*c;
// When x < 0, Math.sqrt(x) retruns NaN
if (x < 0) {
/*
throw exception!
I understand this code can be adjusted to accommodate
imaginary numbers, but for the sake of this example,
let's just have this function throw an exception and
say the coefficients are invalid
*/
}
return (-b + Math.sqrt(x) * polarity) / (2*a);
}
}
いいえ、Javaではできません。
ただし、Object
を返すことができます。また、オブジェクトを返すことで、技術的にはJava.lang.Integer
やJava.lang.Boolean
などの派生クラスを返すことができます。しかし、私はそれが最良の考えだとは思いません。
あなたは技術的にこれを行うことができます:
public <T> T doWork()
{
if(codition)
{
return (T) new Integer(1);
}
else
{
return (T) Boolean.FALSE;
}
}
次に、このコードはコンパイルされます。
int x = doWork(); // the condition evaluates to true
boolean test = doWork();
ただし、メソッドが誤ったタイプを返す場合は、ランタイム例外が発生する可能性が最も高くなります。 TはJava.lang.Objectに消去されるため、プリミティブの代わりにオブジェクトを返す必要もあります。つまり、返される型はオブジェクトを拡張する必要があります(つまり、オブジェクトである必要があります)。上記の例では、オートボクシングを使用してプリミティブな戻り値の型を実現しています。
IMOでは例外処理の使用を評価する必要があるため、このアプローチはお勧めしません。例外を使用して何かを実行できる場合(つまり、リカバリー、永続化、再試行など)、例外的なケースで例外をキャッチします。例外は、予想されるワークフローのexceptionであり、ワークフローの一部ではありません。
番号。あなたができる最善のことは、あなたが返したいかもしれないすべてのものを処理するクラスのインスタンスに戻ることです。
何かのようなもの
public class ReturnObj {
public bool yesno; // yes or no
public int val; // for int values
public String mode; // mode describing what you returned, which the caller will need to understand.
}
明らかに、あなたは名前で遊ぶ必要があります...
また、これはコードのにおいのようです。関数の外で必要なパスを修飾することで、このようなことを行う必要をなくし、修飾に応じて特定の関数を呼び出してブール値を取得したり、特定の関数を呼び出してintを取得したりできます。
IEEE浮動小数点にはNaNの表現が含まれているため、ほとんどの言語は、例外や共用体型なしで特定の例を処理します。 Javaでは、Double.NaNを使用します。
public static double quadratic(double a, double b, double c, int polarity) {
double x = b*b - 4*a*c;
// When x < 0, Math.sqrt(x) retruns NaN
if (x < 0) {
return Double.NaN;
}
return (-b + Math.sqrt(x) * polarity) / (2*a);
}
それはあなたが望む正確な出力を生成します:
x = 4.0
x = 3.0
x = NaN
x = NaN
例外は古いものですJava同様の問題を解決する方法:
public static double quadratic(double a, double b, double c, int polarity) {
double x = b*b - 4*a*c;
// When x < 0, Math.sqrt(x) returns NaN
if (x < 0) {
throw new Exception("NaN")
}
return (-b + Math.sqrt(x) * polarity) / (2*a);
}
例外のクライアントコードは次のとおりです。
a=1; b=-7; c=12;
// x = 4.0
try {
System.out.println("x = " + quadratic(a, b, c, 1));
} catch (Exception iae) {
System.out.println("Oopsie: " + iae.getMessage());
}
// x = 3.0
try {
System.out.println("x = " + quadratic(a, b, c, -1));
} catch (Exception iae) {
System.out.println("Oopsie: " + iae.getMessage());
}
// "invalid" coefficients.
a=4; b=4; c=16;
// Oopsie: NaN
try {
System.out.println("x = " + quadratic(a, b, c, 1));
} catch (Exception iae) {
System.out.println("Oopsie: " + iae.getMessage());
}
// Oopsie: NaN
try {
System.out.println("x = " + quadratic(a, b, c, -1));
} catch (Exception iae) {
System.out.println("Oopsie: " + iae.getMessage());
}
メソッドとの間で関係のない型を本当に渡したり返したりするには、Javaは実際にはサポートしていないUnion型が必要です。しかし、Paguroは nion Types を提供し、 Javaこのように(Orを使用):
public static Or<Double,String> quadratic(double a, double b,
double c, int polarity) {
double x = b*b - 4*a*c;
// When x < 0, Math.sqrt(x) retruns NaN
if (x < 0) {
return Or.bad("NaN");
}
return Or.good((-b + Math.sqrt(x) * polarity) / (2*a));
}
@Test public void testQuadradic() {
double a, b, c;
a=1; b=-7; c=12;
// x = Good(4.0)
System.out.println("x = " + quadratic(a, b, c, 1));
// x = 3.0
System.out.println(
(String) quadratic(a, b, c, -1)
.match(good -> "x = " + good,
bad -> "Oopsie: " + bad));
// "invalid" coefficients.
a=4; b=4; c=16;
// x = Bad("NaN")
System.out.println("x = " + quadratic(a, b, c, 1));
// Oopsie: NaN
System.out.println(
(String) quadratic(a, b, c, -1)
.match(good -> "x = " + good,
bad -> "Oopsie: " + bad));
}
特定の例では、浮動小数点を使用します。より一般的な解決策として、例外よりもユニオンタイプの方が便利だと思います。共用体タイプを、共通のインターフェースまたは祖先を持たない2つの異なる入力を受け取る可能性があるメソッドの引数として使用できます。また、関数型プログラミングにより友好的です。
Object
を返す関数を記述します。 Boolean
またはInteger
ラッパーオブジェクトを返すようにしてください。次に、instanceofを使用して、どちらを使用するかを判断します。
いいえ、1つは顧客への返品参照です。
Booleanとintを一緒にカプセル化する応答オブジェクトを作成し、気まぐれに従って値を設定できます。
しかし、私がユーザーだったら、あなたのデザインは混乱していたと思います。
私の先生は、Java
import Java.util.Scanner;
public class Program {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("Enter number");
String input = scanner.next();
int[] num ={0};
if(tryParse(input,num))
System.out.println(num[0] * num[0]);
}
static boolean tryParse(String inputString,int[] outputInt){
try{
outputInt[0] = Integer.parseInt(inputString);
return true;
}catch(Exception e){
return false;
}
}
}
これは、何をしたいかによっては最善の解決策ではないかもしれませんが、問題を解決する簡単な方法は、関数が可能範囲外の整数または定数(RETURNED_FALSE/TRUEなど)を返し、それを確認することです。 。