fw:请问Null和空字符串('')的区别?

本文详细阐述了在Oracle数据库中Null值与空字符串('')之间的区别。Null被视为未知或无值的状态,而空字符串则是明确的空内容。文章还介绍了Null的特性,包括其在查询、比较及索引中的特殊处理。

请问Null和空字符串('')的区别


目前我们用9i,Null和空字符串('')好像没有区别。如果把某个字段设置为'',系统会自动把它变为Null,请问是否可以把它们设置为不同?  
---------------------------------------------------------------  
 
oracle中,''被认为等于null  
---------------------------------------------------------------  
 
含义解释:      
问:什么是NULL?    
答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零。    
ORACLE允许任何一种数据类型的字段为空,除了以下两种情况:    
1、主键字段(primary  key),    
2、定义时已经加了NOT  NULL限制条件的字段    
 
说明:    
1、等价于没有任何值、是未知数。    
2、 NULL与0、空字符串、空格都不同。    
3、对空值做加、减、乘、除等运算操作,结果仍为空。    
4、NULL的处理使用NVL函数。    
5、比较时使用关键字用“is  null”和“is  not  null”。    
6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查。    
7、排序时比其他数据都大(索引默认是降序排列,小→大),所以NULL值总是排在最后。    
 
---------------------------------------------------------------  
 
SQL>  select  *  from  bb;  
 
A                    B  
-  ----------  
 
SQL>  insert  into  bb  (a)  values('1');  
 
1  row  inserted  
 
SQL>  select  *  from  bb  where  b  is  null;  
 
A                    B  
-  ----------  
1    
 
SQL>  select  *  from  bb  where  b  is  '';  
 
select  *  from  bb  where  b  is  ''  
 
ORA-00908:  missing  NULL  keyword  
 
SQL>  select  *  from  bb  where  b='';  
 
A                    B  
-  ----------  
 
对于以上查询,只能使用null形式了.
 
<think>好的,我现在需要解决用户在JSP注册表单提交后显示系统错误null的问题。首先,用户提到错误信息是“系统错误null”,这通常意味着某个变量或对象为null,而代码尝试调用它的方法或访问其属性,导致指针异常(NullPointerException)。 首先,我要回顾一下用户提供的引用内容,看看是否有相关的线索。引用[3]中的代码示例展示了在注册时检查用户名的逻辑。其中有一行代码是`String username = request.getParameter("username");`,然后直接判断`username.equals("admin")`。这里存在潜在的问题,因为如果表单中没有提交username参数,`request.getParameter("username")`会返回null,这时候调用`equals`方法就会抛出指针异常。 接下来,我需要考虑其他可能引发null的地方。比如,用户可能没有正确填写表单字段,或者表单字段的name属性与后端获取的参数名不一致,导致获取到的参数为null。此外,在处理请求时,如果没有设置字符编码,可能会导致参数解析错误,进而引发异常。引用[3]中的代码虽然设置了请求响应的编码为UTF-8,但可能在某些情况下没有生效,比如在过滤器或服务器配置中覆盖了这些设置。 另外,引用[1]提到在JSP中记录错误信息到日志文件的方法。用户可能没有正确的错误处理机制,导致异常未被捕获,直接显示给用户。需要检查是否有try-catch块来捕获可能的异常,并将错误信息记录到日志中,而不是让用户看到系统错误。 引用[4]讨论了表单重复提交的问题,虽然这可能不是当前问题的直接原因,但表单提交过程中的其他问题,比如参数丢失或多次提交,也可能导致null异常,尤其是在处理请求参数时没有进行充分的验证。 综合这些信息,解决方案可能包括以下几个步骤: 1. **参数值检查**:在处理请求参数时,首先检查是否为null,再进行后续操作。例如,使用安全的方法,如先判断`username != null`,再调用`equals`方法,或者使用`"admin".equals(username)`来避免指针。 2. **表单字段验证**:确保前端表单的字段名称与后端获取的参数名称完全一致,避免因名称不匹配导致参数为null。 3. **增强错误处理**:在代码中添加try-catch块,捕获可能的异常,并将错误信息记录到日志中,同时返回友好的错误提示给用户,而不是显示系统级别的错误信息。 4. **字符编码设置**:确认请求响应的编码设置正确,避免因编码问题导致参数解析错误。可以在Servlet或过滤器中统一设置编码,而不仅在JSP页面中。 5. **日志记录**:按照引用[1]中的方法,将异常信息记录到日志文件,帮助后续排查问题。 6. **前端提示优化**:在用户注册页面,使用JSTL或EL表达式显示错误信息,并确保刷新页面后错误信息能正确清除,避免引用[2]中提到的问题,即错误信息持久化显示。 具体到代码层面,用户提供的引用[3]中的代码需要修改,例如: 原始代码: ```jsp String username = request.getParameter("username"); if(username.equals("admin")){...} ``` 修改后: ```jsp String username = request.getParameter("username"); if(username == null){ // 处理username为null的情况 } else if("admin".equals(username)){...} ``` 或者更简洁地使用安全的比较方式: ```jsp if("admin".equals(username)){...} ``` 这样可以避免当username为null时抛出异常。 另外,在处理所有可能为null的参数时,都应进行值检查,例如密码、邮箱等字段,防止类似的问题发生。 同时,需要确保服务器配置web.xml中的过滤器正确设置了字符编码,以防止参数在解析过程中因编码问题变为乱码或null。 最后,测试各种边界情况,如不填写任何字段、字段名称错误等,确保系统能优雅地处理这些情况,并给出用户友好的提示,而不是系统错误信息。</think>### 解决方案:JSP用户注册表单提交后显示"系统错误null"的排查与修复 --- #### **1. 指针异常定位** 问题根源通常在于未对请求参数进行值检查,例如: ```jsp String username = request.getParameter("username"); if(username.equals("admin")){ // 若username为null,此处触发NullPointerException ... } ``` **修复方法**: 使用安全的字符串比较方式: ```jsp if("admin".equals(username)){ // 即使username为null也不会报错 ... } ``` --- #### **2. 参数完整性验证** 确保所有必填字段在提交时都有值,且参数名与表单字段名完全一致: ```jsp String password = request.getParameter("password"); if(password == null || password.trim().isEmpty()){ request.setAttribute("error", "密码不能为"); request.getRequestDispatcher("register.jsp").forward(request, response); return; } ``` --- #### **3. 统一字符编码** 在Servlet或过滤器中设置请求/响应编码,避免乱码导致参数解析错误: ```java // 在Servlet的doPost方法中 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); ``` --- #### **4. 异常捕获与日志记录** 添加try-catch块捕获异常并记录到日志文件(参考引用[1]): ```jsp <%@ page import="java.util.Date,java.io.*" %> <% try { String username = request.getParameter("username"); // 业务逻辑... } catch (Exception e) { try (FileWriter fw = new FileWriter("logs/error.log", true)) { PrintWriter pw = new PrintWriter(fw); pw.println(new Date() + " - " + request.getRequestURI() + " - " + e.getMessage()); } catch (IOException ioe) { ioe.printStackTrace(); } request.setAttribute("error", "系统繁忙,请稍后重试"); request.getRequestDispatcher("register.jsp").forward(request, response); } %> ``` --- #### **5. 前端错误提示优化** 在JSP页面中使用EL表达式显示错误信息,避免刷新后残留(参考引用[2]): ```jsp <c:if test="${not empty error}"> <div class="alert">${error}</div> </c:if> ``` 提交后重定向(而非转发)可避免重复提交问题(参考引用[4]): ```jsp response.sendRedirect("register_result.jsp"); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值