我试图从Java方法返回2个值但是我得到了这些错误。这是我的代码:
// Method code
public static int something(){
int number1 = 1;
int number2 = 2;
return number1, number2;
}
// Main method code
public static void main(String[] args) {
something();
System.out.println(number1 + number2);
}
错误:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - missing return statement
at assignment.Main.something(Main.java:86)
at assignment.Main.main(Main.java:53)
Java结果:1
答案 0 :(得分:209)
不要返回包含这两个值的数组或使用泛型Pair
类,而应考虑创建一个表示要返回的结果的类,并返回该类的实例。给这个班一个有意义的名字。这种方法比使用数组的好处是类型安全,它将使您的程序更容易理解。
注意:这里的一些其他答案中提出的通用Pair
类也为您提供了类型安全性,但没有传达结果所代表的内容。
示例(不使用真正有意义的名称):
final class MyResult {
private final int first;
private final int second;
public MyResult(int first, int second) {
this.first = first;
this.second = second;
}
public int getFirst() {
return first;
}
public int getSecond() {
return second;
}
}
// ...
public static MyResult something() {
int number1 = 1;
int number2 = 2;
return new MyResult(number1, number2);
}
public static void main(String[] args) {
MyResult result = something();
System.out.println(result.getFirst() + result.getSecond());
}
答案 1 :(得分:64)
Java不支持多值返回。返回一组值。
// Function code
public static int[] something(){
int number1 = 1;
int number2 = 2;
return new int[] {number1, number2};
}
// Main class code
public static void main(String[] args) {
int result[] = something();
System.out.println(result[0] + result[1]);
}
答案 2 :(得分:36)
如果您确定只需返回两个值,则可以实现通用Pair
:
public class Pair<U, V> {
/**
* The first element of this <code>Pair</code>
*/
private U first;
/**
* The second element of this <code>Pair</code>
*/
private V second;
/**
* Constructs a new <code>Pair</code> with the given values.
*
* @param first the first element
* @param second the second element
*/
public Pair(U first, V second) {
this.first = first;
this.second = second;
}
//getter for first and second
然后让方法返回Pair
:
public Pair<Object, Object> getSomePair();
答案 3 :(得分:22)
你只能在Java中返回一个值,所以最好的方法是这样的:
return new Pair<Integer>(number1, number2);
以下是您的代码的更新版本:
public class Scratch
{
// Function code
public static Pair<Integer> something() {
int number1 = 1;
int number2 = 2;
return new Pair<Integer>(number1, number2);
}
// Main class code
public static void main(String[] args) {
Pair<Integer> pair = something();
System.out.println(pair.first() + pair.second());
}
}
class Pair<T> {
private final T m_first;
private final T m_second;
public Pair(T first, T second) {
m_first = first;
m_second = second;
}
public T first() {
return m_first;
}
public T second() {
return m_second;
}
}
答案 4 :(得分:5)
你必须使用集合来返回多个返回值
在您的情况下,您将代码编写为
public static List something(){
List<Integer> list = new ArrayList<Integer>();
int number1 = 1;
int number2 = 2;
list.add(number1);
list.add(number2);
return list;
}
// Main class code
public static void main(String[] args) {
something();
List<Integer> numList = something();
}
答案 5 :(得分:4)
使用Pair / Tuple类型的对象,如果你依赖Apache commons-lang,你甚至不需要创建一个。只需使用Pair类。
答案 6 :(得分:4)
以下是SimpleEntry的简单而简短的解决方案:
AbstractMap.Entry<String, Float> myTwoCents=new AbstractMap.SimpleEntry<>("maximum possible performance reached" , 99.9f);
String question=myTwoCents.getKey();
Float answer=myTwoCents.getValue();
仅使用Java内置函数,它具有类型安全性好处。
答案 7 :(得分:3)
public class Mulretun
{
public String name;;
public String location;
public String[] getExample()
{
String ar[] = new String[2];
ar[0]="siva";
ar[1]="dallas";
return ar; //returning two values at once
}
public static void main(String[] args)
{
Mulretun m=new Mulretun();
String ar[] =m.getExample();
int i;
for(i=0;i<ar.length;i++)
System.out.println("return values are: " + ar[i]);
}
}
o/p:
return values are: siva
return values are: dallas
答案 8 :(得分:2)
您不需要创建自己的类来返回两个不同的值。只需使用这样的HashMap:
private HashMap<Toy, GameLevel> getToyAndLevelOfSpatial(Spatial spatial)
{
Toy toyWithSpatial = firstValue;
GameLevel levelToyFound = secondValue;
HashMap<Toy,GameLevel> hm=new HashMap<>();
hm.put(toyWithSpatial, levelToyFound);
return hm;
}
private void findStuff()
{
HashMap<Toy, GameLevel> hm = getToyAndLevelOfSpatial(spatial);
Toy firstValue = hm.keySet().iterator().next();
GameLevel secondValue = hm.get(firstValue);
}
您甚至可以享受类型安全的好处。
答案 9 :(得分:2)
在我看来,最好是创建一个新类,构造函数是你需要的函数,例如:
public class pairReturn{
//name your parameters:
public int sth1;
public double sth2;
public pairReturn(int param){
//place the code of your function, e.g.:
sth1=param*5;
sth2=param*10;
}
}
然后只需使用构造函数,就像使用函数一样:
pairReturn pR = new pairReturn(15);
你可以使用pR.sth1,pR.sth2作为&#34; 2函数的结果&#34;
答案 10 :(得分:2)
我很好奇为什么没有人想出更优雅的回调解决方案。因此,不使用返回类型,而是使用作为参数传递给方法的处理程序。下面的例子有两种截然不同的方法。我知道这两个对我来说更优雅。 : - )
public class DiceExample {
public interface Pair<T1, T2> {
T1 getLeft();
T2 getRight();
}
private Pair<Integer, Integer> rollDiceWithReturnType() {
double dice1 = (Math.random() * 6);
double dice2 = (Math.random() * 6);
return new Pair<Integer, Integer>() {
@Override
public Integer getLeft() {
return (int) Math.ceil(dice1);
}
@Override
public Integer getRight() {
return (int) Math.ceil(dice2);
}
};
}
@FunctionalInterface
public interface ResultHandler {
void handleDice(int ceil, int ceil2);
}
private void rollDiceWithResultHandler(ResultHandler resultHandler) {
double dice1 = (Math.random() * 6);
double dice2 = (Math.random() * 6);
resultHandler.handleDice((int) Math.ceil(dice1), (int) Math.ceil(dice2));
}
public static void main(String[] args) {
DiceExample object = new DiceExample();
Pair<Integer, Integer> result = object.rollDiceWithReturnType();
System.out.println("Dice 1: " + result.getLeft());
System.out.println("Dice 2: " + result.getRight());
object.rollDiceWithResultHandler((dice1, dice2) -> {
System.out.println("Dice 1: " + dice1);
System.out.println("Dice 2: " + dice2);
});
}
}
答案 11 :(得分:1)
您也可以将可变对象作为参数发送,如果您使用方法修改它们,那么当您从函数返回时它们将被修改。它不适用于像Float这样的东西,因为它是不可变的。
public class HelloWorld{
public static void main(String []args){
HelloWorld world = new HelloWorld();
world.run();
}
private class Dog
{
private String name;
public void setName(String s)
{
name = s;
}
public String getName() { return name;}
public Dog(String name)
{
setName(name);
}
}
public void run()
{
Dog newDog = new Dog("John");
nameThatDog(newDog);
System.out.println(newDog.getName());
}
public void nameThatDog(Dog dog)
{
dog.setName("Rutger");
}
}
结果是: 拉特格
答案 12 :(得分:1)
返回一个对象数组
{{1}}
答案 13 :(得分:0)
首先,如果Java有元组可以返回多个值,那会更好。
第二,编写尽可能简单的Pair
类,或使用数组。
但是,如果您要做需要返回一对,请考虑它代表什么概念(从其字段名称开始,然后是类名称)-以及它是否发挥了比您想象的更大的作用,并且是否有助于您的整体设计具有明确的抽象。也许是code hint
...
请注意:我并不是在教条地说它会有帮助,只是看一下查看是否有用...
答案 14 :(得分:-3)
这是您在JS中执行的操作:
return { objA, valueB }
。
我知道这是题外话,但是在看到必须在Java中实现一个全新的类之后,我不能不发表此评论。 JavaScript-不再浪费生命,开始编写脚本!