Java 操作结果错误:";局部变量success可能尚未初始化。”;

Java 操作结果错误:";局部变量success可能尚未初始化。”;,java,struts2,action,actionresult,struts-action,Java,Struts2,Action,Actionresult,Struts Action,“未解决的编译问题:局部变量输入可能尚未初始化局部变量成功可能尚未初始化局部变量输入可能尚未初始化”我一直在尝试用3个输入填充我的数据库,我对MySQl的struts2框架非常陌生,所以任何类型的洞察或输入都会非常有用。我是否包含了足够的代码信息?这是我的ActionClass <pre> package com.tutorialspoint.struts2; import java.sql.Connection; import java.sql.DriverManager; im

“未解决的编译问题:局部变量输入可能尚未初始化局部变量成功可能尚未初始化局部变量输入可能尚未初始化”我一直在尝试用3个输入填充我的数据库,我对MySQl的struts2框架非常陌生,所以任何类型的洞察或输入都会非常有用。我是否包含了足够的代码信息?这是我的ActionClass

<pre> package com.tutorialspoint.struts2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{

    private String osName;
    private String version;
    private String notes;



    public String execute() throws Exception {

        String input;
        String success;
        String ret = input;
        Connection conn = null;

        try{
            String URL = "jdbc:mysql://localhost/HelloWorld";
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(URL, "root", "");
            String sql = "SELECT osName FROM entry WHERE";
            sql+=" osName = ? AND version = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, osName);
            ps.setString(2, version);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                notes = rs.getString(1);
                ret = success;
            }
        }catch (Exception e) {
            ret = input;
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                }
            }
        }

        return ret;
    }


        public String getOsName() {
        return osName;
    }
    public void setOsName(String osName) {
        this.osName = osName;
    }
    public String getVersion() {
        return version;
    }
    public void setVersion(String version) {
        this.version = version;
    }
    public String getNotes() {
        return notes;
    }
    public void setNotes(String notes) {
        this.notes = notes;
    }

    public void validate()
    {
        if (osName == null || osName.trim().equals(""))
        { 
            addFieldError("osName","The OS name is required");
        }
        if (version == null || version.trim().equals(""))
        {
            addFieldError("version","The OS version is required");
        }
    }
}
package com.tutorialspoint.struts2;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入com.opensymphony.xwork2.ActionSupport;
公共类HelloWorldAction扩展了ActionSupport{
私有字符串osName;
私有字符串版本;
私人弦乐;
公共字符串execute()引发异常{
字符串输入;
串成功;
字符串ret=输入;
连接conn=null;
试一试{
String URL=“jdbc:mysql://localhost/HelloWorld";
Class.forName(“com.mysql.jdbc.Driver”);
conn=DriverManager.getConnection(URL,“根目录”,“根目录”);
String sql=“从其中的条目中选择osName”;
sql+=“osName=?和版本=?”;
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,osName);
ps.setString(2,版本);
结果集rs=ps.executeQuery();
while(rs.next()){
notes=rs.getString(1);
ret=成功;
}
}捕获(例外e){
ret=输入;
}最后{
如果(conn!=null){
试一试{
康涅狄格州关闭();
}捕获(例外e){
}
}
}
返回ret;
}
公共字符串getOsName(){
返回osName;
}
public void setOsName(字符串osName){
this.osName=osName;
}
公共字符串getVersion(){
返回版本;
}
公共void setVersion(字符串版本){
this.version=版本;
}
公共字符串getNotes(){
回条;
}
公共无效设置注释(字符串注释){
this.notes=注释;
}
public void validate()
{
if(osName==null | | osName.trim().equals(“”)
{ 
addFieldError(“osName”,“需要OS名称”);
}
if(version==null | | version.trim().equals(“”)
{
addFieldError(“版本”,“需要操作系统版本”);
}
}
}

您的
输入
成功
是本地变量,没有默认值。当您点击行
ret=input
时,您没有在
input
中输入任何内容,因此该赋值没有意义。对于
ret=success
,情况也一样;在方法中的任何位置,您都不会为
success
赋值。

success
ERROR
INPUT
NONE
LOGIN
是预定义的框架常量,由
ActionSupport
类定义,由您的操作扩展

因此,撇开您没有初始化变量这一事实不谈(您应该做的是:

ret = SUCCESS;
...
ret = INPUT;
),它们绝对不需要,因为您可以返回常量值:

ret = "success";
...
ret = "input";
或者,当不扩展ActionSupport时,文本值:


为了避免输入错误,最好使用常量。

注意,只需将
sql
字符串合并为一个常量即可。没有理由那样分开。您可能不应该为单个请求打开和关闭数据库连接;它们非常昂贵。您正在对数据库做完全不同的事情,您的实际问题是什么?这些是我的Struts.xml结果页面的index.jsp/success.jsp的结果名称,所以您可能想以某种方式将它们作为参数传递给该方法?我想是吗?我正在学习教程。我的程序有点不同。我正在尝试将3个字段输入记录到我的数据库中。有人能看看我的github文件并告诉我发生了什么吗?创建表
oslog
entry
osName
VARCHAR(10)不为空,
version
VARCHAR(10)不为空,
notes
VARCHAR(20)不为空,主键(
osName
)引擎=InnoDB;是我的DBA吗?你至少读过提供的答案了吗?您的错误与数据库无关,在上面的答案中有详细的解释以及正确的操作方法,因此请阅读并尝试,然后当它起作用时,通过在左上角标记白色V来接受答案。然后,如果您仍然有问题,它们是其他问题,需要作为单独的原子问题发布
ret = "success";
...
ret = "input";