Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 在强制转换JSP隐式对象的属性时,是否应该添加try/catch?_Java_Jsp_Casting - Fatal编程技术网

Java 在强制转换JSP隐式对象的属性时,是否应该添加try/catch?

Java 在强制转换JSP隐式对象的属性时,是否应该添加try/catch?,java,jsp,casting,Java,Jsp,Casting,基本上我的意思是这样的: List<String[]> routes = (List<String[]>)application.getAttribute("routes"); out.print(routes.get(0)[1]); 它确实打印出一些奇怪的东西: [Ljava.lang.String;@18b352f 我正在打印“字符串指针”吗?我终于可以得到这样一个例外: List<String[]> routes = (List<String

基本上我的意思是这样的:

List<String[]> routes = (List<String[]>)application.getAttribute("routes");
out.print(routes.get(0)[1]);
它确实打印出一些奇怪的东西:

[Ljava.lang.String;@18b352f
我正在打印“字符串指针”吗?我终于可以得到这样一个例外:

List<String[]> routes = (List<String[]>)application.getAttribute("routes");
out.print(routes.get(0)[1]);
有误:

java.lang.ClassCastException: [Ljava.lang.String;
因为是我添加了应用程序属性,所以我知道应该将其转换为哪种类型。我觉得这还不够“好”,如果我忘记了确切的类型怎么办? 我知道在某些情况下仍然会发生这种情况,例如在JSP/Servlet中,当您对会话属性进行强制转换时。有更好的方法吗

在你说:“天哪,为什么不使用servlet?”,我应该证明我的理由是:-因为我的uni很烂,它的服务器只能使用JSP生成的servlet,我真的不想学习如何解决这样的问题。 ,这是uni的家庭作业,所以我别无选择,忘了war、WEB-INF等,而是“将所有内容直接编码到JSP中”——因为教授们也这么做

Java使用类型擦除来存储集合。也就是说,编译器强制执行类型安全,但将集合减少为
对象的集合
。因此,当您从bean中拉出一个列表对象时,它是一个
列表
,而不是
列表

因为它是一个集合,所以可以获取第n个元素(正如您所做的)。然而,你得到的不是你所期望的。因此,当您从集合中取出一个元素并将其强制转换为
Double
,而不是
String
,运行时将最终生成一个对象

[Ljava.lang.String;@18b352f
是对字符串数组的引用,顺便说一句(“[”表示数组)

出于这个原因(以及其他原因),我不喜欢存储类型集合的集合。我更喜欢创建特定的对象类型(容器)然后向该对象请求我需要的元素。因此,在从bean中提取该对象时,您只需强制转换一次,然后在该对象中管理处理列表中双精度数组的复杂性(您可以要求容器对象为您查找元素,提取/强制转换的逻辑在一个位置等)

Java使用类型擦除来存储集合。也就是说,编译器强制执行类型安全,但将集合减少为
对象的集合
。因此,当您从bean中拉出列表对象时,它是
列表
,而不是
列表

因为它是一个集合,所以您可以获得第n个元素(正如您所做的)。但是,您获得的对象不是您所期望的。因此,当您从集合中取出一个元素并将其强制转换(将其转换为
Double
,而不是
String
),运行时最终将对象

[Ljava.lang.String;@18b352f
是对字符串数组的引用,顺便说一句(“[”表示数组)

出于这个原因(以及其他原因),我不喜欢存储类型集合的集合。我更喜欢创建特定的对象类型(容器)然后向该对象请求我需要的元素。因此,在从bean中提取该对象时,您只需强制转换一次,然后在该对象中管理处理列表中双精度数组的复杂性(您可以要求容器对象为您查找元素,提取/强制转换的逻辑在一个位置等)

创建一个类(应用程序),在ServletContext上存储一次,然后以常规Java风格调用该类上的方法

在该应用程序类中添加一个方法

// Make sure that ATTRIBUTE_NAME is somewhat unique.
private final static String ATTRIBUTE_NAME =
    Application.getClass( ).getName( );

List< String > myList;

public saveToAppContext ( ServletContext context )
{
    context.setAttribute( ATTRIBUTE_NAME, this );
}

public static Application getAttribute ( ServletContext context )
{
    return (Application) context.getAttribute( ATTRIBUTE_NAME );
}

// Because you store object in application scope, ensure that
// access methods are thread-safe
//
// This is just an example, you may need something with better
// performance
synchronized List< String > getStringList ( )
{
    return new ArrayList<String>(myList);
}
//确保属性名称是唯一的。
私有最终静态字符串属性\u名称=
Application.getClass().getName();
列表myList;
公共存储到应用上下文(ServletContext)
{
setAttribute(属性名称,this);
}
公共静态应用程序getAttribute(ServletContext上下文)
{
返回(应用程序)context.getAttribute(属性名称);
}
//因为您将对象存储在应用程序范围中,所以请确保
//访问方法是线程安全的
//
//这只是一个例子,你可能需要一些更好的
//演出
同步列表getStringList()
{
返回新的ArrayList(myList);
}
现在,安装程序将在加载/卸载ServletContext时初始化和销毁应用程序对象

contextInitialized
方法应创建应用程序对象,并将其保存为ServletContext上的属性。

创建一个类(应用程序),在ServletContext上存储一次,然后以常规Java样式调用该类上的方法

在该应用程序类中添加一个方法

// Make sure that ATTRIBUTE_NAME is somewhat unique.
private final static String ATTRIBUTE_NAME =
    Application.getClass( ).getName( );

List< String > myList;

public saveToAppContext ( ServletContext context )
{
    context.setAttribute( ATTRIBUTE_NAME, this );
}

public static Application getAttribute ( ServletContext context )
{
    return (Application) context.getAttribute( ATTRIBUTE_NAME );
}

// Because you store object in application scope, ensure that
// access methods are thread-safe
//
// This is just an example, you may need something with better
// performance
synchronized List< String > getStringList ( )
{
    return new ArrayList<String>(myList);
}
//确保属性名称是唯一的。
私有最终静态字符串属性\u名称=
Application.getClass().getName();
列表myList;
公共存储到应用上下文(ServletContext)
{
setAttribute(属性名称,this);
}
公共静态应用程序getAttribute(ServletContext上下文)
{
返回(应用程序)context.getAttribute(属性名称);
}
//因为您将对象存储在应用程序范围中,所以请确保
//访问方法是线程安全的
//
//这只是一个例子,你可能需要一些更好的
//演出
同步列表getStringList()
{
返回新的ArrayList(myList);
}
现在,安装程序将在加载/卸载ServletContext时初始化和销毁应用程序对象


contextInitialized
方法应该创建应用程序对象,并将其保存为ServletContext上的属性。

所以你是说就是这样。没有更好的解决方案吗?其实,我对此很满意,只是想知道是否有更好的方法来做到这一点:)同意你的解决方案。如果我要用我的环境编写代码,我会正如我在最后一段中所解释的,这更像是一个挑战,只使用java定义的类型来制定解决方案。因此,不需要用户定义的类型。我知道