Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用callable传递两个参数并返回一个参数数组_Java_Arrays_Callable - Fatal编程技术网

Java 使用callable传递两个参数并返回一个参数数组

Java 使用callable传递两个参数并返回一个参数数组,java,arrays,callable,Java,Arrays,Callable,我必须将两个字符串传递给一个线程,该线程将返回一个包含这两个字符串的数组,我必须使用callable 以下是我目前掌握的情况: public class toArray implements Callable<String[]> { private String string1 string2; public toArray (String first, String second) { string1= first; string2 = second; }

我必须将两个字符串传递给一个线程,该线程将返回一个包含这两个字符串的数组,我必须使用callable

以下是我目前掌握的情况:

public class toArray implements Callable<String[]> {

private String string1 string2;

public toArray (String first, String second)
{
    string1= first;
    string2 = second;
}

    @Override
    public String[] call() throws Exception {
        String [] allStrings = null;
            allStrings[0] = string1;
            allStrings[1] = string2;
        return allStrings;
    }
}
公共类toArray实现可调用{
私有字符串string1 string2;
公共toArray(字符串第一,字符串第二)
{
string1=第一;
string2=秒;
}
@凌驾
公共字符串[]call()引发异常{
String[]allStrings=null;
所有字符串[0]=string1;
所有字符串[1]=字符串2;
返回所有字符串;
}
}
主要内容如下:

public class theFuntion{

    public static void main(String[] args) {


        FutureTask<String[]> task = new FutureTask (new MyCallable());
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit (task);
        try{
               String[] result = task.get();
               System.out.println(result[1] + result[2]);
           }
        catch(Exception e){
                           System.err.println(e);
    }
         es.shutdown();
}
public类基金{
公共静态void main(字符串[]args){
FutureTask task=newFutureTask(newMyCallable());
ExecutorService es=Executors.newSingleThreadExecutor();
提交(任务);
试一试{
String[]result=task.get();
System.out.println(结果[1]+结果[2]);
}
捕获(例外e){
系统错误println(e);
}
es.shutdown();
}

问题出在
main
:它说result需要字符串[],但它得到了一个对象。如果我强制转换result,它会说必须声明抛出异常。

在中,参数化类型
V
代表的结果类型。因为您希望返回
字符串[]
,使用
Callable
,而不是
Callable
。然后,将
call
的返回类型更改为
String[]

@Override
public String[] call() throws Exception {
    String [] allStrings = new String[2];
    allStrings[0] = string1;
    allStrings[1] = string2;
    return allStrings;
}

作为旁注,Java中的类名是名词,应该以大写字母开头。

将类的签名更改为

public class toArray implements Callable<String[]>
更新: 好的,有不止一个错误。。。 请参阅以下工作示例

public class Test{

    public static void main(String[] args) {


        FutureTask<String[]> task = new FutureTask(new MyCallable("a", "b"));
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit (task);
        try{
            String[] result = task.get();
            System.out.println(result[0] + result[1]);
        }
        catch(Exception e){
            System.err.println(e);
        }
        es.shutdown();
    }

    public static class MyCallable implements Callable<String[]>
    {

        private String string1, string2;

        public MyCallable (String first, String second)
        {
            string1= first;
            string2 = second;
        }

        @Override
        public String[] call() throws Exception {
            String [] allStrings = new String[2];
            allStrings[0] = string1;
            allStrings[1] = string2;
            return allStrings;
        }
    }
}
公共类测试{
公共静态void main(字符串[]args){
FutureTask任务=新的FutureTask(新的MyCallable(“a”、“b”));
ExecutorService es=Executors.newSingleThreadExecutor();
提交(任务);
试一试{
String[]result=task.get();
System.out.println(结果[0]+结果[1]);
}
捕获(例外e){
系统错误println(e);
}
es.shutdown();
}
公共静态类MyCallable实现了Callable
{
私有字符串string1、string2;
公共MyCallable(第一个字符串,第二个字符串)
{
string1=第一;
string2=秒;
}
@凌驾
公共字符串[]call()引发异常{
字符串[]所有字符串=新字符串[2];
所有字符串[0]=string1;
所有字符串[1]=字符串2;
返回所有字符串;
}
}
}

您没有在
函数
中引用
到Array
类,可能是由于编译错误(提示:已提到修复)

您的新未来任务如下所示:

FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));
FutureTask task=newfuturetask(newtoarray(“foo”、“bar”));
如果不告诉您简单的答案,您将在
ToArray
中的
call()
方法中遇到2个异常:

  • 首先,字符串数组从未初始化,但应该初始化
  • 所有数组都从零开始

您是否有任何错误或奇怪的行为?我立即注意到的一个问题是,尽管您尝试在方法签名中返回
String[]
,但您没有声明将在方法签名中返回
String[]
。另一个问题是
allStrings
初始化为
null
,然后重新使用。您可能想要
String[]allStrings=newstring[2]
这并不完全是一个错误(但如果你想听听我的意见,应该是):Java中的类名应该以大写字母开头。所以
ToArray
而不是
ToArray
。我遇到的问题主要是:它说结果需要一个字符串[]但是它得到了一个对象。如果我强制转换结果,它会说必须声明抛出一个异常“然后,将调用的返回类型更改为String[]:“就像在return allStrings[];?@Ryan:不,返回类型是在
public
访问器之后。使用
public String调用
,而不是
public String调用
调用。这样,您可以将返回类型从String更改为String[]。代码中还有许多其他错误。例如,
new MyCallable()是什么?
?它不应该是
new toArray(“某个字符串”、“其他字符串”)吗
?另外,使用
新建FutureTask
私有字符串string1 string2;也是无效的,要么用逗号分隔两个变量
私有字符串string1,string2;
,要么使用两个不同的语句。最后,java中的数组是
0索引的
,因此第一个位置是[0],而不是[1]。是否有异常?您是否将
allStrings=null
的初始化更改为
allStrings=new String[2]
?并将类名
toArray
更改为
MyCallable
我编辑了:FutureTask task=new FutureTask(new toArray(“foo”,“bar”);非常感谢,但仍然没有更改。
FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));