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定义的类型来制定解决方案。因此,不需要用户定义的类型。我知道